package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.login.TsLogin;
import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import com.atguigu.tingshu.common.rabbit.service.RabbitService;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.atguigu.tingshu.vo.album.AlbumStatVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.List;

@Slf4j
@Service
@SuppressWarnings({"all"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

    @Autowired
    private AlbumInfoMapper albumInfoMapper;

    @Autowired
    private AlbumAttributeValueMapper albumAttributeValueMapper;

    @Autowired
    private AlbumStatMapper albumStatMapper;
    @Autowired
    private TrackInfoServiceImpl trackInfoServiceImpl;

    @Autowired
    private RabbitService rabbitService;


    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId) {

        //创建一个专辑对象
        AlbumInfo albumInfo = new AlbumInfo();
        //属性拷贝
        BeanUtils.copyProperties(albumInfoVo, albumInfo);
        //设置专辑状态为通过
        albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
        //设置用户id
        albumInfo.setUserId(userId);

        //付费的默认前10集免费试看
        if (!SystemConstant.ALBUM_PAY_TYPE_FREE.equals(albumInfo.getPayType())) {
            albumInfo.setTracksForFree(10);
            albumInfo.setSecondsForFree(30);
        }
        //保存albumInfo信息
        albumInfoMapper.insert(albumInfo);
        //获取专辑属性值集合
        List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
        //判断集合是否为空，严谨一点，避免空指针异常
        if (!CollectionUtils.isEmpty(albumAttributeValueVoList)) {
            //循环遍历集合，给albumAttributeValue赋值
		/*for (AlbumAttributeValueVo albumAttributeValueVo : albumAttributeValueVoList) {
			//创建一个albumAttributeValue的对象
			AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
			//属性复制
			BeanUtils.copyProperties(albumAttributeValueVo,albumAttributeValue);
			//专辑信息已经保存了，会生成一个id，直接获取到并赋值
			albumAttributeValue.setAlbumId(albumInfo.getId());
			albumAttributeValueMapper.insert(albumAttributeValue);
		}*/ //等价于下列代码。  stream流式处理
            albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> {
                AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
                BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
                albumAttributeValue.setAlbumId(albumInfo.getId());
                albumAttributeValueMapper.insert(albumAttributeValue);
            });
        }

        //初始化统计数据
        //播放量
        this.saveAlbumStatType(albumInfo.getId(),SystemConstant.ALBUM_STAT_PLAY);
        //订阅量
        this.saveAlbumStatType(albumInfo.getId(),SystemConstant.ALBUM_STAT_SUBSCRIBE);
        //购买量
        this.saveAlbumStatType(albumInfo.getId(),SystemConstant.ALBUM_STAT_BROWSE);
        //评论数
        this.saveAlbumStatType(albumInfo.getId(),SystemConstant.ALBUM_STAT_COMMENT);

        //	发送上架消息
        if ("1".equals(albumInfo.getIsOpen())){
            rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM, MqConst.ROUTING_ALBUM_UPPER, albumInfo.getId());
        }
    }

    public  void saveAlbumStatType(Long albumId,String statType) {
        AlbumStat albumStat = new AlbumStat();
        albumStat.setAlbumId(albumId);
        albumStat.setStatType(statType);
        albumStat.setStatNum(0);
        albumStatMapper.insert(albumStat);
    }


    @Override
    public IPage<AlbumListVo> findUserAlbumPage(Page<AlbumListVo> albumListVoPage, AlbumInfoQuery albumInfoQuery) {
        //查询信息包含这个专辑信息与专辑统计信息
        return albumInfoMapper.selectUserAlbumPage(albumListVoPage, albumInfoQuery);
    }


    @Override
    @Transactional(rollbackFor = Exception.class)
    public void removeAlbumInfoById(Long albumId) {
        //删除albumInfo数据
        albumInfoMapper.deleteById(albumId);
        //删除albumStat数据
        albumStatMapper.delete(new LambdaQueryWrapper<AlbumStat>().eq(AlbumStat::getAlbumId, albumId));

        //删除albumAttributeValue数据
        albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, albumId));
        //下架
        rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM, MqConst.ROUTING_ALBUM_LOWER, albumId);
    }

    @Override
    public AlbumInfo getAlbumInfo(Long albumId) {
        //获取专辑信息 等价于 albumInfoMapper.selectById(albumId);
        AlbumInfo albumInfo = this.getById(albumId);
        if (albumInfo != null){
            List<AlbumAttributeValue> albumAttributeValues = albumAttributeValueMapper.selectList(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, albumId));
            albumInfo.setAlbumAttributeValueVoList(albumAttributeValues);
        }
        return albumInfo;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateAlbumInfo(Long albumId, AlbumInfoVo albumInfoVo) {
        //创建一个专辑对象
        AlbumInfo albumInfo = new AlbumInfo();
        //属性拷贝
        BeanUtils.copyProperties(albumInfoVo, albumInfo);
        albumInfo.setId(albumId);
        albumInfoMapper.updateById(albumInfo);
        //删除原有的数据
        albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, albumId));
        List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
        //判断集合是否为空，严谨一点，避免空指针异常
        if (!CollectionUtils.isEmpty(albumAttributeValueVoList)) {
            //循环遍历集合，给albumAttributeValue赋值
		/*for (AlbumAttributeValueVo albumAttributeValueVo : albumAttributeValueVoList) {
			//创建一个albumAttributeValue的对象
			AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
			//属性复制
			BeanUtils.copyProperties(albumAttributeValueVo,albumAttributeValue);
			//专辑信息已经保存了，会生成一个id，直接获取到并赋值
			albumAttributeValue.setAlbumId(albumInfo.getId());
			albumAttributeValueMapper.insert(albumAttributeValue);
		}*/ //等价于下列代码。  stream流式处理
            albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> {
                AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
                BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
                albumAttributeValue.setAlbumId(albumInfo.getId());
                albumAttributeValueMapper.insert(albumAttributeValue);
            });
        }
        if ("1".equals(albumInfo.getIsOpen())){
            rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM, MqConst.ROUTING_ALBUM_UPPER, albumInfo.getId());
        }else {
            rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM, MqConst.ROUTING_ALBUM_LOWER, albumInfo.getId());
        }
    }

    @Override
    public List<AlbumInfo> findUserAllAlbumList(Long userId) {
//        List<AlbumInfo> albumInfos = albumInfoMapper.selectList(new LambdaQueryWrapper<AlbumInfo>().select(AlbumInfo::getId, AlbumInfo::getAlbumTitle).eq(AlbumInfo::getUserId, userId).orderByDesc(AlbumInfo::getId));
        //先写死
        Page<AlbumInfo> albumInfoPage = new Page<>(1, 20);
        //查询分页
        Page<AlbumInfo> albumInfoPage1 = albumInfoMapper.selectPage(albumInfoPage, new LambdaQueryWrapper<AlbumInfo>().select(AlbumInfo::getId, AlbumInfo::getAlbumTitle).eq(AlbumInfo::getUserId, userId).orderByDesc(AlbumInfo::getId));
        //分页对象调用getRecords()方法获取集合数据
        List<AlbumInfo> albumInfos = albumInfoPage1.getRecords();
        System.out.println(albumInfos.size());
        return albumInfos;
    }

    @Override
    public AlbumStatVo getAlbumStat(Long albumId) {

       AlbumStatVo albumStatVo = albumInfoMapper.selectAlbumStat(albumId);
        return albumStatVo;

    }
}
